除了昨天介紹的格式之外,字型的基礎就是「字」。
對人類來說,字就是字,不需要特別約定;但在僅以 0 與 1 儲存的電腦上,我們輸入的文字都會被編碼(encoding)成二進位。假如我們今天要傳訊息給別人,接收方要如何將這些二進位的訊號解碼(decoding)回原本的意思呢?
很直觀的想法是,我們可以透過「字符與代碼映射關係」的小冊子,如同查閱雙語字典一般,在傳送方進行編碼時,可以先找尋文本與對應的代碼;而接受方在收到代號後,也能夠回頭查詢與代碼相對應的文本。
這樣的小冊子就是「字元集(character set)」。
在電腦剛誕生的時候,資訊交換的必要性極低。但在大型商業電腦與通用作業系統的出現後,電腦不再只是一台計算機,隨著各種應用程式落地發展,我們開始需要和陌生人交換資訊——但大家手上的小冊子都不一樣呀,要怎麼讓雙方都能無歧意的交換訊息?
此時,人們意識到,我們需要一本共用的小冊子。
1964 年,作為當時電腦業界的老大,IBM 推出了 EBCDIC(Extended Binary Coded Decimal Interchange Code,擴展二進位編碼的十進位交換碼)解決方案,替一些常用的字母映射(mapping)到獨一無二的碼位(code point)上。
還記得我們昨天提到的,第一台擁有終端顯示器的 IBM 2260 商用電腦嗎?他使用的字元集就是 EBCDIC。
在最初的版本裡,EBCDIC 包含了控制字元(control character)、符號、數字、以及大小寫英文在內等字元。可惜的是,EBCDIC 在規劃時並沒有把英文放在連續的相鄰位置,這給程式處理帶來一定程度的麻煩。
四年後的 1968 年,ANSI(American National Standard Institute,美國國家標準學會)在檢討 EBCDIC 的優點與缺點後,發布了 ASCII(American Standard Code for Information Interchange,美國訊息交換標準碼)方案。
和 EBCDIC 最大的不同就在於,ASCII 將英文大小寫放在連續位置上,極大方便了程式的處理。舉例來說,如果要將大小寫轉換,可以簡單的對 ASCII 索引值加減 32 來進行轉換,但 EBCDIC 就必須考慮到字符中間不連續的狀態。
# 一個簡單的大小寫轉換方法
def changeCase(string):
result = ""
for word in string:
if word >= "A" and word <= "Z":
result += chr(ord(word) + 32)
elif word >= "a" and word <= "z":
result += chr(ord(word) - 32)
else:
result += word
return result
print(changeCase("Hello, World!"))
#hELLO, wORLD!
》Image Source: Wikipedia
考慮到字符的數量,ASCII 僅用了七位的 bit 來紀錄字元,同時保留最高的 bit (b8
) 用作校驗位(check bit),預留為 0
。舉例來說,大寫 A
是0100 0001
,換成十進位也就是 65
。
將每種二進位的組合對應一個字符——共有 2^7=128(編號 0-127)種組合——這 128 個「格子」對美國人使用的英文來說,已經足夠放下所有需要的字母和符號。但如果要紀錄歐洲的其他的語言,例如有 é
的法文(像是 café)怎麼辦?
很快地,廠商就把腦筋動到了還沒有使用到的最高位 bit——只要把這一位改成 1
,就可以再額外「擴充」出另外 128 個格子出來放這些字母。可以說,只要該書寫系統的字母少於 256 (2^8) 個,便能透過 ASCII 擴充。
例如 IBM 為西歐國家的拉丁文字擴充的 Code page 437 標準、為希臘文字擴充的 Code page 737、為波羅的海三小國文字擴充的 Code page 775、為中歐國家所需的拉丁文字擴充的 Code page 852、為西里爾文字擴充的 Code page 855 等等。
很快地,ASCII 成為歐美最通用的標準,在歷經數十年的推廣與擴充後,ASCII 已經可以藉由「擴充」的方式囊括所有歐洲文字所需的字符。
但透過這種權宜之計依舊會遇到跨國的交換問題——如果我跟你的擴充標準不一樣,對應的字符就會不同,「亂碼」就出現了。此外,當 1980 年代電腦登陸東亞市場,面對動輒數千、甚至數萬的漢字又要怎麼處理?
於是,東亞各國的電腦廠家便自行增加 Byte 數量來進行擴充,例如日本制定了自己國內的工業標準 Shift JIS、中國則制定了 GB2312,台灣則有由資策會的 Big5。
編碼解決方案 | 用多少 Byte 來表示一個「字」 |
---|---|
EBCDIC | 1 Byte |
ASCII | 1 Byte |
Shift JIS(日本工業標準) | 2 Byte |
GB2312(中華人民共和國國家標準) | 2 Byte |
Big 5(大五碼) | 2 Byte |
本來想要終結分裂的 ASCII,卻因其擴充性不佳,反而帶來了新的混亂。
或許,是時候想個辦法來一統天下了。